home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 January / PCWorld_2007-01_cd.bin / v cisle / hotkey / AutoHotkey104504_Install.exe / AutoHotkey.chm / docs / scripts / joystickmouse.ahk < prev    next >
Text File  |  2006-11-15  |  5KB  |  156 lines

  1. ; Using a Joystick as a Mouse
  2. ; http://www.autohotkey.com
  3. ; This script converts a joystick into a three-button mouse.  It allows each
  4. ; button to drag just like a mouse button and it uses virtually no CPU time.
  5. ; Also, it will move the cursor faster depending on how far you push the joystick
  6. ; from center. You can personalize various settings at the top of the script.
  7.  
  8. ; Increase the following value to make the mouse cursor move faster:
  9. JoyMultiplier = 0.30
  10.  
  11. ; Decrease the following value to require less joystick displacement-from-center
  12. ; to start moving the mouse.  However, you may need to calibrate your joystick
  13. ; -- ensuring it's properly centered -- to avoid cursor drift. A perfectly tight
  14. ; and centered joystick could use a value of 1:
  15. JoyThreshold = 3
  16.  
  17. ; Change the following to true to invert the Y-axis, which causes the mouse to
  18. ; move vertically in the direction opposite the stick:
  19. InvertYAxis := false
  20.  
  21. ; Change these values to use joystick button numbers other than 1, 2, and 3 for
  22. ; the left, right, and middle mouse buttons.  Available numbers are 1 through 32.
  23. ; Use the Joystick Test Script to find out your joystick's numbers more easily.
  24. ButtonLeft = 1
  25. ButtonRight = 2
  26. ButtonMiddle = 3
  27.  
  28. ; If your joystick has a POV control, you can use it as a mouse wheel.  The
  29. ; following value is the number of milliseconds between turns of the wheel.
  30. ; Decrease it to have the wheel turn faster:
  31. WheelDelay = 250
  32.  
  33. ; If your system has more than one joystick, increase this value to use a joystick
  34. ; other than the first:
  35. JoystickNumber = 1
  36.  
  37. ; END OF CONFIG SECTION -- Don't change anything below this point unless you want
  38. ; to alter the basic nature of the script.
  39.  
  40. #SingleInstance
  41.  
  42. JoystickPrefix = %JoystickNumber%Joy
  43. Hotkey, %JoystickPrefix%%ButtonLeft%, ButtonLeft
  44. Hotkey, %JoystickPrefix%%ButtonRight%, ButtonRight
  45. Hotkey, %JoystickPrefix%%ButtonMiddle%, ButtonMiddle
  46.  
  47. ; Calculate the axis displacements that are needed to start moving the cursor:
  48. JoyThresholdUpper := 50 + JoyThreshold
  49. JoyThresholdLower := 50 - JoyThreshold
  50. if InvertYAxis
  51.     YAxisMultiplier = -1
  52. else
  53.     YAxisMultiplier = 1
  54.  
  55. SetTimer, WatchJoystick, 10  ; Monitor the movement of the joystick.
  56.  
  57. GetKeyState, JoyInfo, %JoystickNumber%JoyInfo
  58. IfInString, JoyInfo, P  ; Joystick has POV control, so use it as a mouse wheel.
  59.     SetTimer, MouseWheel, %WheelDelay%
  60.  
  61. return  ; End of auto-execute section.
  62.  
  63.  
  64. ; The subroutines below do not use KeyWait because that would sometimes trap the
  65. ; WatchJoystick quasi-thread beneath the wait-for-button-up thread, which would
  66. ; effectively prevent mouse-dragging with the joystick.
  67.  
  68. ButtonLeft:
  69. SetMouseDelay, -1  ; Makes movement smoother.
  70. MouseClick, left,,, 1, 0, D  ; Hold down the left mouse button.
  71. SetTimer, WaitForLeftButtonUp, 10
  72. return
  73.  
  74. ButtonRight:
  75. SetMouseDelay, -1  ; Makes movement smoother.
  76. MouseClick, right,,, 1, 0, D  ; Hold down the right mouse button.
  77. SetTimer, WaitForRightButtonUp, 10
  78. return
  79.  
  80. ButtonMiddle:
  81. SetMouseDelay, -1  ; Makes movement smoother.
  82. MouseClick, middle,,, 1, 0, D  ; Hold down the right mouse button.
  83. SetTimer, WaitForMiddleButtonUp, 10
  84. return
  85.  
  86. WaitForLeftButtonUp:
  87. if GetKeyState(JoystickPrefix . ButtonLeft)
  88.     return  ; The button is still, down, so keep waiting.
  89. ; Otherwise, the button has been released.
  90. SetTimer, WaitForLeftButtonUp, off
  91. SetMouseDelay, -1  ; Makes movement smoother.
  92. MouseClick, left,,, 1, 0, U  ; Release the mouse button.
  93. return
  94.  
  95. WaitForRightButtonUp:
  96. if GetKeyState(JoystickPrefix . ButtonRight)
  97.     return  ; The button is still, down, so keep waiting.
  98. ; Otherwise, the button has been released.
  99. SetTimer, WaitForRightButtonUp, off
  100. MouseClick, right,,, 1, 0, U  ; Release the mouse button.
  101. return
  102.  
  103. WaitForMiddleButtonUp:
  104. if GetKeyState(JoystickPrefix . ButtonMiddle)
  105.     return  ; The button is still, down, so keep waiting.
  106. ; Otherwise, the button has been released.
  107. SetTimer, WaitForMiddleButtonUp, off
  108. MouseClick, middle,,, 1, 0, U  ; Release the mouse button.
  109. return
  110.  
  111. WatchJoystick:
  112. MouseNeedsToBeMoved := false  ; Set default.
  113. SetFormat, float, 03
  114. GetKeyState, joyx, %JoystickNumber%JoyX
  115. GetKeyState, joyy, %JoystickNumber%JoyY
  116. if joyx > %JoyThresholdUpper%
  117. {
  118.     MouseNeedsToBeMoved := true
  119.     DeltaX := joyx - JoyThresholdUpper
  120. }
  121. else if joyx < %JoyThresholdLower%
  122. {
  123.     MouseNeedsToBeMoved := true
  124.     DeltaX := joyx - JoyThresholdLower
  125. }
  126. else
  127.     DeltaX = 0
  128. if joyy > %JoyThresholdUpper%
  129. {
  130.     MouseNeedsToBeMoved := true
  131.     DeltaY := joyy - JoyThresholdUpper
  132. }
  133. else if joyy < %JoyThresholdLower%
  134. {
  135.     MouseNeedsToBeMoved := true
  136.     DeltaY := joyy - JoyThresholdLower
  137. }
  138. else
  139.     DeltaY = 0
  140. if MouseNeedsToBeMoved
  141. {
  142.     SetMouseDelay, -1  ; Makes movement smoother.
  143.     MouseMove, DeltaX * JoyMultiplier, DeltaY * JoyMultiplier * YAxisMultiplier, 0, R
  144. }
  145. return
  146.  
  147. MouseWheel:
  148. GetKeyState, JoyPOV, %JoystickNumber%JoyPOV
  149. if JoyPOV = -1  ; No angle.
  150.     return
  151. if (JoyPOV > 31500 or JoyPOV < 4500)  ; Forward
  152.     Send {WheelUp}
  153. else if JoyPOV between 13500 and 22500  ; Back
  154.     Send {WheelDown}
  155. return
  156.